package com.yy.base.common.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

@SuppressWarnings("unchecked")
public interface Dao {
	void save(Object obj);
	void update(Object obj);
	void delete(Object obj);
	<T> T get(Class<T> clz, Serializable id);
	/**
	 * 传入实体对象、表名保存数据
	 * obj： 实体对象
	 * table：表名
	 */
	int save(Object obj, String table);
	/**
	 * 传入实体对象、表名修改数据
	 * obj： 实体对象
	 * table：表名
	 */
	int update(Object obj, String table);
	/**
	 * 传入实体对象、表名修改数据
	 * obj： 实体对象
	 * table：表名
	 * idName: 主键属性
	 */
	int update(Object obj, String table, String idName);
	/**
	 * 通过hql语句查询结果
	 */
	List find(String hql, Object... objs);
	/**
	 * hql查询转换为Map集合
	 */
	List<Map> findToMap(String hql, Object... objs);
	/**
	 * hql查询转换为实体集合
	 */
	<T> List<T> findToEntity(Class<T> clzz, String hql, Object... objs);
	/**
	 * 通过hql语句查询结果
	 */
	Object findUnique(String hql, Object... objs);
	/**
	 * 通过hql语句分页查询结果
	 */
	List splitFind(String hql, Object... objs);
	/**
	 * 分页hql查询
	 */
	List<Map> splitFindToMap(String hql, Object... objs);
	/**
	 * 获得hql的统计结果
	 */
	Long getHqlCount(String hql, Object... objs);
	/**
	 * 执行新增、修改、删除sql语句
	 */
	int executeSql(String sql, Object... objs);
	/**
	 * 执行新增、修改、删除sql语句
	 */
	int executeSql(String sql, Map params);
	/**
	 * 通过sql语句查询结果
	 */
	List<Map<String, Object>> query(String sql, Object... objs);
	/**
	 * 通过sql语句查询结果
	 */
	<T> List<T> query(Class<T> clzz, String sql, Object... objs);
	/**
	 * 通过sql语句查询结果
	 */
	List<Map<String, Object>> query(String sql, Map params);
	/**
	 * 通过sql语句查询结果
	 */
	Map<String, Object> queryUnique(String sql, Object... objs);
	/**
	 * 通过sql语句查询结果
	 */
	<T> T queryUnique(Class<T> clzz, String sql, Object... objs);
	/**
	 * 通过sql语句分页查询结果
	 */
	List<Map<String, Object>> splitQuery(String sql, Object... objs);
	/**
	 * 通过sql语句分页查询结果
	 */
	List<Map<String, Object>> splitQuery(String sql, Map params);
	/**
	 * 获得sql的统计结果
	 */
	Long getSqlCount(String sql, Object... objs);
	/**
	 * 获得sql的统计结果
	 */
	Long getSqlCount(String sql, Map params);
	/**
	 * 执行存储过程函数
	 * @param sql
	 * @param parms
	 */
	void callSql(final String sql, final Object... parms);
	/**
	 * 得到表字段属性
	 */
	List<Map> getFields(String table);
}